/**
 * Systemprogrammierung
 * Multiplayer-Quiz
 *
 * Client
 *	\author
 *	\file client/command.c:
 *	\brief Implementierung des Command-Threads */

#include "gui/gui_interface.h"
#include "common/sockets.h"
#include "command.h"
#include "main.h"

int sock; /**< Globale Variable für Server Socket */

int client_id; /**< Globale Client-ID */

uint8_t answer; /**< Globale Variable für Antwortindex */

/**	\brief Antwort setzen
 *	\param index Beinhaltet den Antwortindex 0-3 */
void set_answer(int index) {
	answer = (uint8_t) index;
}

/** \brief Antwort holen
 *  \return antwort */
int get_answer() {
	return answer;
}

/**	\brief Katalogauswahl geändert
 * 	Aktuelle Katalogauswahl wird an Server gesendet damit der Server
 * 	sie an alle Clients weiterleiten kann
 * 	\param newSelection Beinhaltet die neue Auswahl des Katalogs */
void preparation_onCatalogChanged(const char *newSelection) {
	debugPrint("Katalogauswahl: %s", newSelection);

	// Neuen Katalog an Server senden
	if (catch_com_err(send_MSG(sock, CATALOG_CHANGE, strlen(newSelection),
			(void*) newSelection)) == COM_ERR) {
		debugPrint("Verbindung zum Server verloren\n");
		guiShowErrorDialog("Verbindung zum Server verloren", 1);
	}
}

/** \brief Spielleiter hat auf Start geklickt
 *  Start wird an Server gesendet damit der Server das Spiel starten kann
 *  \param currentSelection Beinhaltet die aktuelle Auswahl des Katalogs */
void preparation_onStartClicked(const char *currentSelection) {
	debugPrint("Starte Katalog %s", currentSelection);

	// "Start" an Server senden
	if (catch_com_err(send_MSG(sock, START_GAME, strlen(currentSelection),
			(void*) currentSelection)) == COM_ERR) {
		debugPrint("Verbindung zum Server verloren\n");
		guiShowErrorDialog("Verbindung zum Server verloren", 1);
	}
}

/** \brief Vorbereitungsfenster geschlossen */
void preparation_onWindowClosed(void) {
	debugPrint("Vorbereitungsfenster geschlossen");
	guiQuit();
}

/** \brief Client hat auf Antwort geklickt
 * 	\param index Beinhaltet den Antwortindex 0-3 */
void game_onAnswerClicked(int index) {
	debugPrint("Antwort %i ausgewählt", index);
	set_answer(index);
	game_setAnswerButtonsEnabled(0);

	// Antwort an Server senden
	if (catch_com_err(
			send_MSG(sock, QUESTION_ANSWERED, sizeof(answer), &answer))
			== COM_ERR) {
		debugPrint("Verbindung zum Server verloren\n");
		guiShowErrorDialog("Verbindung zum Server verloren", 1);
	}
}

/** \brief Spielfenster geschlossen */
void game_onWindowClosed(void) {
	debugPrint("Spielfenster geschlossen");
	guiQuit();
}

/** \brief Start des Command-Thread (GUI-Schleife)
 * 	\param param Standardübergabeparameter */
void* command_thread(void* param) {

	// Hole Socket von Server
	sock = get_socket();

	int argc = get_main_argc();

	char **argv = get_main_argv();

	// GUI initialisieren
	guiInit(&argc, &argv);

	// Semaphor hochzählen, damit Listener Thread fortfahren kann (GUI wurde initialisiert)
	sem_post(&command_init);

	client_id = get_client_id();

	// Wenn Client-ID = 0 wird Client Spielleiter
	if (client_id == 0) {

		// Schalte Spielleiter-Rechte frei
		preparation_setMode(PREPARATION_MODE_PRIVILEGED);

		debugPrint("Login erfolgreich - Spielleiter - Client ID: %d\n",
				client_id);

	} else {

		// Client ist normaler Spieler
		preparation_setMode(PREPARATION_MODE_NORMAL);

		debugPrint("Login erfolgreich - Client ID: %d\n", client_id);
	}

	/* Anfragen der Katalogliste von Server */
	if (catch_com_err(send_MSG(sock, CATALOG_REQUEST, 0, NULL)) == COM_ERR) {

		debugPrint("Verbindung zum Server verloren\n");

		// Thread beenden
		pthread_exit(NULL);

		return NULL;
	}

	// Zeige Fenster der Spielvorbereitung an
	preparation_showWindow();

	/* GUI-Schleife (Thread steht, bis guiQuit aufgerufen wird) */
	guiMain();

	// GUI freigeben
	guiDestroy();

	// Thread beenden
	pthread_exit(NULL);

	return NULL;
}
